#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>

int main(int argc, char const *argv[])
{
    if(argc != 3){
        printf("Usage: %s <src> <dst>\n", argv[0]);
        return -1;
    }
    
    FILE *fp1 = fopen(argv[1], "r");
    FILE *fp2 = fopen(argv[2], "w");

    if(!fp2 || !fp2){
        perror("打开文件失败!\n");
        return -1;
    }

    // //fgetc按字节读取
    // while(1){
    //     //读取源文件
    //     int ch = fgetc(fp1);
    //     if(ch == EOF){
    //         if(feof(fp1)){
    //             printf("拷贝完毕!\n");
    //             return 0;
    //         }
    //         if(ferror(fp1)){
    //             perror("读取源文件失败!\n");
    //             return -1;
    //         }
    //     }
    //     else fputc(ch, fp2);
    // }

    // //fgets按行读取
    // char buf[10];
    // while(1){
    //     char *p = fgets(buf, 10, fp1);
    //     if(p == NULL){
    //         if(feof(fp1)){
    //             printf("拷贝完成!\n");
    //             return 0;
    //         }
    //         if(ferror(fp1)){
    //             perror("读取源文件失败!\n");
    //             return -1;
    //         }
    //     }
    //     else fputs(buf, fp2);
    // }

    //fread按块读取
    char *buf = calloc(5, 20);//分配5块连续20字节内存
    while(1){
        long a = ftell(fp1);
        int read_piece = fread(buf, 20, 5, fp1);
        if(read_piece < 5){
            if(feof(fp1)){
                long b = ftell(fp1);
                fwrite(buf, b-a, 1, fp2);
                printf("拷贝成功!\n");
                break;
            }
            if(ferror(fp1)){
                perror("读取源文件失败!\n");
                return -1;
            }
        }
        fwrite(buf, 20, 5, fp2);
    }

    fclose(fp1);
    fclose(fp2);
    return 0;
}
